// 这里是引入方法的名称
import * as actionTypes from './constants'

import { Map } from 'immutable';
// immutable 里有两个方法 一个是 map 浅层的数据修改 
//  一个是 fromJS 深层次的数据修改
//  一般 我们用的都是map  基本上map的功能就够用了


// react的性能优化 使用Immuetable 这个函数 
// reducer 里的数据copy 这段代码是有些问题的{...state,topBanners:action.topBanners}
//  如果 topBanners里的数据比较多 而我们修改的数据就是一点 这样去copy 是非常浪费性能和内存的
//  使用Immuetable 能很好的解决这个问题 
//  我们使用 Immuetable 把topBanners 包裹起来 修改用get  拿值 用set  
//  然后把值 最后给 reducer

// 原本写法
// const defaultState = {
//     topBanners:[]
// }

const defaultState = Map({
    topBanners:[],
    hotRecommends:[],
    newAlbums:[],

    upRanking: {},
    newRanking: {},
    originRanking: {},
})

//因为第一次的defaultState 通过immutable的 Map方法转换成了 immutable对象  
// 所以  state 就是一个 immutable对象

// 最后一定要把更新后的state 返回出来
function reducer(state = defaultState, action){
    switch(action.type){
        case actionTypes.CHANGE_TOP_BANNERS:
            // return {...state,topBanners:action.topBanners}
            return state.set("topBanners",action.topBanners);
            // 一旦 通过set方法修改过后 他就会返回一个新的对象 
            // 然后通过return 把这个新的对象 返回过去
        
        case actionTypes.CHANGE_HOT_RECOMMENDS:
            return state.set("hotRecommends",action.hotRecommends);
		case actionTypes.CHANGE_NEW_ALBUM:
            return state.set("newAlbums",action.newAlbums);
            
        case actionTypes.CHANGE_UP_RANKING:
            return state.set("upRanking", action.upRanking);
        case actionTypes.CHANGE_NEW_RANKING:
            return state.set("newRanking", action.newRanking);
        case actionTypes.CHANGE_ORIGIN_RANKING:
            return state.set("originRanking", action.originRanking);
        default:
            return state;
    }
} 

export default reducer;

// function reducer(state = defaultState, action) {
//     switch (action.type) { 
//       case ADD_NUMBER:
//         return { ...state, counter: state.counter + action.num };
//       case DECREMENT:
//         return { ...state, counter: state.counter - 1 };
//       default:
//         return state;
//     }
//   }